/*
 * ModVisi.java
 * 
 * Copyright (C) 2008 David Castellanos Serrano
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package dpoo.figuras;

/**
 * Permite recoger y guardar la información sobre la visibilidad y/o modificadores de una clase, método o atributo.
 * @author david
 */
public class ModVisi {

    //constantes relacionadas con la VISIBILIDAD
    public static final int PAQUETE = 0;
    public static final int PRIVADO = 1;
    public static final int PROTEGIDO = 2;
    public static final int PUBLICO = 3;
    
    /**
     * A partir de un identificador de visibilidad devuelve el String asociado
     * @param visibilidad
     * @return
     */
    public static String visibilidad2String(int visibilidad) {
        String foo = "";
        
        switch(visibilidad) {
            case ModVisi.PAQUETE:
                break;
            case ModVisi.PRIVADO:
                foo = "private";
                break;
            case ModVisi.PROTEGIDO:
                foo = "protected";
                break;
            case ModVisi.PUBLICO:
                foo = "public";
                break;
        }
        
        return foo;
    }
    
    
    //visibilidad
    private int visibilidad;

    //modificadores
    private boolean modAbstracto;
    private boolean modFinal;
    private boolean modEstatico;

    /**
     * Crea un objeto ModVisi
     * @param visibilidad
     * @param mAbstracto
     * @param mFinal
     * @param mEstatico
     */
    public ModVisi (int visibilidad, boolean mAbstracto, boolean mFinal, boolean mEstatico) {
        this.visibilidad = visibilidad;
        this.modAbstracto = mAbstracto;
        this.modFinal = mFinal;
        this.modEstatico = mEstatico;
    }

    /**
     * Devuelve el estado del modificador "abstracto"
     * @return
     */
    public boolean getModAbstracto () {
        return modAbstracto;
    }

    /**
     * Fija el estado del modificador "abstracto"
     * @param val
     */
    public void setModAbstracto (boolean val) {
        this.modAbstracto = val;
    }

    /**
     * Devuelve el estado del modificador "estático"
     * @return
     */
    public boolean getModEstatico () {
        return modEstatico;
    }

    /**
     * Fija el estado del modificador "estático"
     * @param val
     */
    public void setModEstatico (boolean val) {
        this.modEstatico = val;
    }

    /**
     * Devuelve el estado del modificador "final"
     * @return
     */
    public boolean getModFinal () {
        return modFinal;
    }

    /**
     * Fija el estado del modificador "final"
     * @param val
     */
    public void setModFinal (boolean val) {
        this.modFinal = val;
    }

    /**
     * Devuelve el valor del estado de visibilidad del objeto
     * @return
     */
    public int getVisibilidad () {
        return visibilidad;
    }

    /**
     * Fija el valor de la visibilidad del objeto
     * @param val
     */
    public void setVisibilidad (int val) {
        if((val >= 0) && (val <= 3)) {
            this.visibilidad = val;
        } else {
            this.visibilidad = ModVisi.PUBLICO;
        }   
    }
    
    
    /**
     * Devuelve una representación como String del objeto ModVisi
     * @return
     */
    @Override
    public String toString() {
        String foo = ModVisi.visibilidad2String(this.visibilidad) + " ";
        if(this.modAbstracto) {
            foo += "abstract ";
        }
        if(this.modEstatico) {
            foo += "static ";
        }
        if(this.modFinal) {
            foo += "final ";
        }
        
        return foo;
    }

}

